package pe.com.yugi.Bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;
import pe.com.yugi.DAO.CartaDAO;
import pe.com.yugi.DAO.CombinacionDAO;
import pe.com.yugi.DAO.DetalleCombDAO;
import pe.com.yugi.DAO.Impl.CartaDAOImpl;
import pe.com.yugi.DAO.Impl.CombinacionDAOImpl;
import pe.com.yugi.DAO.Impl.DetalleCombDAOImpl;
import pe.com.yugi.DAO.Impl.PlanetaDAOImpl;
import pe.com.yugi.DAO.Impl.TipoCartaDAOImpl;
import pe.com.yugi.DAO.PlanetaDAO;
import pe.com.yugi.DAO.TipoCartaDAO;
import pe.com.yugi.Dominio.Carta;
import pe.com.yugi.Dominio.Combinacion;
import pe.com.yugi.Dominio.DetalleComb;
import pe.com.yugi.Dominio.Planeta;
import pe.com.yugi.Dominio.TipoCarta;

@ManagedBean
@ViewScoped
public class MantenimientoBean implements Serializable {

    private List<Carta> listaCarta;
    private Carta cartaSelec;
    private final CartaDAO cartaDAO;
    private String nombreCarta;
    private int ataque;
    private int defensa;
    private List<TipoCarta> listaTipoCarta;
    private int idTipoCartaSelec;
    private List<Planeta> listaPlaneta;
    private int idPlanetaSelec;
    private final TipoCartaDAO tipoCartaDAO;
    private final PlanetaDAO planetaDAO;
    private String nombreTipoCarta;
    private String nombrePlaneta;
    private int poder;
    private List<Carta> listaCartaJuego;
    private Carta cartaJuegoSelec;
    private int idCartaJuegoSelec;
    private String combinacion = "";
    private List<Carta> listaCartaComb;
    private Carta cartaCombSelec;
    private int idCartaCombSelec;
    private DetalleCombDAO detalleDAO;
    private CombinacionDAO combinacionDAO;
    private String validoSelec;
    private int idCartaNuevaComb;
    private List<CombinacionModel> combModel;

    public MantenimientoBean() {
        cartaDAO = new CartaDAOImpl();
        tipoCartaDAO = new TipoCartaDAOImpl();
        detalleDAO = new DetalleCombDAOImpl();
        combinacionDAO = new CombinacionDAOImpl();
        planetaDAO = new PlanetaDAOImpl();
        listaCartaComb = new ArrayList<>();
        listaCartaJuego = new ArrayList<>();
        listarCartas();
        listarPlanetas();
        listarTipoCarta();
    }

    public void combinacionResultado() {
        combModel = new ArrayList<>();
        String com = "";
        String com2 = "";
        String nuevaCarta = "";
        int encuentra = 0;
        combinacion = "";
        int contador = 0;
        if (listaCartaJuego.size() > 0) {
            for (int i = 0; i < listaCartaJuego.size(); i++) {
                Carta c = listaCartaJuego.get(i);
                List<DetalleComb> listaDetalle = detalleDAO.listarDetalle(c.getIdCarta());
                com = "";
                for (int j = 0; j < listaDetalle.size(); j++) {
                    DetalleComb detalle = listaDetalle.get(j);
                    Combinacion comb = detalle.getCombinacion();
                    List<DetalleComb> listaDetalleComb = detalleDAO.listarDetalleComb(comb.getIdCombinacion());
                    encuentra = 0;
                    nuevaCarta = "= Combinacion:" + comb.getCarta().getNombre() + " Ataque:" + comb.getCarta().getAtaque()
                            + " Defensa:" + comb.getCarta().getDefensa() + " // ";
                    for (int m = 0; m < listaDetalleComb.size(); m++) {
                        Carta cartaDet = listaDetalleComb.get(m).getCarta();
                        for (int z = 0; z < listaCartaJuego.size(); z++) {
                            Carta carta = listaCartaJuego.get(z);
                            int id1 = cartaDet.getIdCarta();
                            int id2 = carta.getIdCarta();
                            if (id1 == id2) {
                                encuentra++;
                                if (m == 0) {
                                    com = com + cartaDet.getNombre();
                                } else {
                                    com = com + "+" + cartaDet.getNombre();
                                }
                            }
                        }
                    }
                    if (encuentra == listaDetalleComb.size()) {
                        if (contador == 0) {
                            com2 = com;
                            CombinacionModel cResult = new CombinacionModel();
                            cResult.setCartas(com);
                            if (comb.getValida() == 0) {
                                cResult.setValida("Invalida");
                            } else {
                                cResult.setCartaCombinada(comb.getCarta().getNombre());
                                cResult.setValida("Valida");
                                cResult.setAtaque(comb.getCarta().getAtaque() + "");
                                cResult.setDefensa(comb.getCarta().getDefensa() + "");
                            }
                            combModel.add(cResult);
                            combinacion = combinacion + com + nuevaCarta;
                            com = "";
                        } else {
                            if (com.equals(com2)) {

                            } else {
                                com2 = com;
                                CombinacionModel cResult = new CombinacionModel();
                                cResult.setCartas(com);
                                if (comb.getValida() == 0) {
                                    cResult.setValida("Invalida");
                                } else {
                                    cResult.setCartaCombinada(comb.getCarta().getNombre());
                                    cResult.setValida("Valida");
                                    cResult.setAtaque(comb.getCarta().getAtaque() + "");
                                    cResult.setDefensa(comb.getCarta().getDefensa() + "");
                                }
                                combModel.add(cResult);
                                combinacion = combinacion + com + nuevaCarta;
                                com = "";
                            }
                        }
                        contador++;
                    }
                }
            }
        }

    }
    
    public void eliminarCarta(Carta c){
        System.out.println("eliminar carta "+c.getNombre());
        listaCartaJuego.remove(c);
    }

    public void limpiarCarta() {
        nombreCarta = "";
        ataque = 0;
        defensa = 0;
        nombrePlaneta = "";
        nombreTipoCarta = "";
        poder = 0;
    }

    public void agregarCartaJuego() {
        Carta c = cartaDAO.obtenerCarta(idCartaJuegoSelec);
        listaCartaJuego.add(c);
    }

    public void agregarCartaComb() {
        Carta c = cartaDAO.obtenerCarta(idCartaCombSelec);
        listaCartaComb.add(c);
    }

    public void agregarCarta() {
        Carta c = new Carta();
        c.setNombre(nombreCarta);
        c.setAtaque(ataque);
        c.setDefensa(defensa);
        TipoCarta t = tipoCartaDAO.obtenerTipoCarta(idTipoCartaSelec);
        Planeta p = planetaDAO.obtenerPlaneta(idPlanetaSelec);
        if (t != null) {
            c.setTipoCarta(t);
        }
        if (c != null) {
            c.setPlaneta(p);
        }
        boolean agregar = cartaDAO.agregar(c);
        if (agregar) {
            listarCartas();
            limpiarCarta();
            FacesMessage msg = new FacesMessage("Carta agregada", null);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void agregarCombinacion() {
        Combinacion comb = new Combinacion();
        if (validoSelec.equals("Valido")) {
            comb.setValida(1);
        } else {
            comb.setValida(0);
        }
        Carta c = cartaDAO.obtenerCarta(idCartaNuevaComb);
        comb.setCarta(c);
        System.out.println("carta:" + comb.getCarta().getNombre() + " //valido:" + comb.getValida());
        boolean result = combinacionDAO.agregar(comb);
        if (result) {
            Combinacion combUltimo = combinacionDAO.obtenerUltimaCombinacion();
            for (Carta co : listaCartaComb) {
                DetalleComb d = new DetalleComb();
                d.setCarta(co);
                d.setCombinacion(combUltimo);
                result = detalleDAO.agregar(d);
            }
            if (result) {
                listaCartaComb = new ArrayList<>();
                FacesMessage msg = new FacesMessage("Combinacion agregada", null);
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
        }
    }

    public void agregarTipoCarta() {
        TipoCarta t = new TipoCarta();
        t.setNombre(nombreTipoCarta);
        boolean agregar = tipoCartaDAO.agregar(t);
        if (agregar) {
            listarTipoCarta();
            nombreTipoCarta = "";
            FacesMessage msg = new FacesMessage("Tipo de Carta agregada", null);
            FacesContext.getCurrentInstance().addMessage(null, msg);
            RequestContext context = RequestContext.getCurrentInstance();
            context.execute("PF('dlg1').show();");
        }
    }

    public void agregarPlaneta() {
        Planeta p = new Planeta();
        p.setNombre(nombrePlaneta);
        p.setPoder(poder);
        boolean agregar = planetaDAO.agregar(p);
        if (agregar) {
            listarPlanetas();
            nombrePlaneta = "";
            FacesMessage msg = new FacesMessage("Planeta agregado", null);
            FacesContext.getCurrentInstance().addMessage(null, msg);
            RequestContext context = RequestContext.getCurrentInstance();
            context.execute("PF('dlg2').show();");
        }
    }

    public int getIdCartaNuevaComb() {
        return idCartaNuevaComb;
    }

    public void setIdCartaNuevaComb(int idCartaNuevaComb) {
        this.idCartaNuevaComb = idCartaNuevaComb;
    }

    public void listarCartas() {
        listaCarta = cartaDAO.listarCartas();
    }

    public void listarPlanetas() {
        listaPlaneta = planetaDAO.listarPlaneta();
    }

    public void listarTipoCarta() {
        listaTipoCarta = tipoCartaDAO.listarTipoCartas();
    }

    public List<Carta> getListaCarta() {
        return listaCarta;
    }

    public void setListaCarta(List<Carta> listaCarta) {
        this.listaCarta = listaCarta;
    }

    public Carta getCartaSelec() {
        return cartaSelec;
    }

    public void setCartaSelec(Carta cartaSelec) {
        this.cartaSelec = cartaSelec;
    }

    public String getNombreCarta() {
        return nombreCarta;
    }

    public void setNombreCarta(String nombreCarta) {
        this.nombreCarta = nombreCarta;
    }

    public int getAtaque() {
        return ataque;
    }

    public void setAtaque(int ataque) {
        this.ataque = ataque;
    }

    public int getDefensa() {
        return defensa;
    }

    public void setDefensa(int defensa) {
        this.defensa = defensa;
    }

    public List<TipoCarta> getListaTipoCarta() {
        return listaTipoCarta;
    }

    public void setListaTipoCarta(List<TipoCarta> listaTipoCarta) {
        this.listaTipoCarta = listaTipoCarta;
    }

    public int getIdTipoCartaSelec() {
        return idTipoCartaSelec;
    }

    public void setIdTipoCartaSelec(int idTipoCartaSelec) {
        this.idTipoCartaSelec = idTipoCartaSelec;
    }

    public List<Planeta> getListaPlaneta() {
        return listaPlaneta;
    }

    public void setListaPlaneta(List<Planeta> listaPlaneta) {
        this.listaPlaneta = listaPlaneta;
    }

    public int getIdPlanetaSelec() {
        return idPlanetaSelec;
    }

    public void setIdPlanetaSelec(int idPlanetaSelec) {
        this.idPlanetaSelec = idPlanetaSelec;
    }

    public String getNombreTipoCarta() {
        return nombreTipoCarta;
    }

    public void setNombreTipoCarta(String nombreTipoCarta) {
        this.nombreTipoCarta = nombreTipoCarta;
    }

    public String getNombrePlaneta() {
        return nombrePlaneta;
    }

    public void setNombrePlaneta(String nombrePlaneta) {
        this.nombrePlaneta = nombrePlaneta;
    }

    public int getPoder() {
        return poder;
    }

    public void setPoder(int poder) {
        this.poder = poder;
    }

    public List<Carta> getListaCartaJuego() {
        return listaCartaJuego;
    }

    public void setListaCartaJuego(List<Carta> listaCartaJuego) {
        this.listaCartaJuego = listaCartaJuego;
    }

    public Carta getCartaJuegoSelec() {
        return cartaJuegoSelec;
    }

    public void setCartaJuegoSelec(Carta cartaJuegoSelec) {
        this.cartaJuegoSelec = cartaJuegoSelec;
    }

    public int getIdCartaJuegoSelec() {
        return idCartaJuegoSelec;
    }

    public void setIdCartaJuegoSelec(int idCartaJuegoSelec) {
        this.idCartaJuegoSelec = idCartaJuegoSelec;
    }

    public String getCombinacion() {
        return combinacion;
    }

    public void setCombinacion(String combinacion) {
        this.combinacion = combinacion;
    }

    public List<Carta> getListaCartaComb() {
        return listaCartaComb;
    }

    public void setListaCartaComb(List<Carta> listaCartaComb) {
        this.listaCartaComb = listaCartaComb;
    }

    public Carta getCartaCombSelec() {
        return cartaCombSelec;
    }

    public void setCartaCombSelec(Carta cartaCombSelec) {
        this.cartaCombSelec = cartaCombSelec;
    }

    public int getIdCartaCombSelec() {
        return idCartaCombSelec;
    }

    public void setIdCartaCombSelec(int idCartaCombSelec) {
        this.idCartaCombSelec = idCartaCombSelec;
    }

    public String getValidoSelec() {
        return validoSelec;
    }

    public void setValidoSelec(String validoSelec) {
        this.validoSelec = validoSelec;
    }

    public List<CombinacionModel> getCombModel() {
        return combModel;
    }

    public void setCombModel(List<CombinacionModel> combModel) {
        this.combModel = combModel;
    }
}
